The .NET framework is a common language infrastructure (CLI) framework that provides the compile time and run-time functions to build and run applications written in languages that conform to the common language specification (CLS). The .NET framework consists of two core components, a common language runtime (CLR) and a framework class library (FCL). The CLR is the execution environment of the .NET framework. The CLR provides a language-independent layer of abstraction between CLS-compliant programming languages and an operating system (OS) with a primary function of just-in-time (JIT) compilation of common intermediate language (CIL) code generated by a CLS-compliant language compiler into native code to the OS. During execution of an application, the CLR is responsible for memory management, thread execution, garbage collection, exception handling, common type system definition, code safety verification, and other system services. The FCL is a library of language-independent and type-safe reusable classes, interfaces, and value types that expedite and optimize the development process and provide access to system functionality.
Source code written in a CLS-compliant programming language is compiled into CIL code as a collection of types and resources called an assembly. Each assembly contains an assembly manifest and portable executable (PE) code. The assemblies can include one or more program files. The program files may be executable files stored in a PE file format as either process assemblies (.exe) or library assemblies (.dll). The PE code of an assembly may be stored in one or more code modules (e.g., net modules). In this case, the net module(s) are associated with an assembly manifest in an assembly to be executed by a JIT compiler. The assembly manifest contains a set of metadata with information that describes the assembly and its contents and may itself be stored in a PE file.
.NET assemblies are an immutable logical unit for managed languages such as C#, VB.NET, and C++/CLI. If there is a change to source code, the entire source code needs to be recompiled to recreate the assembly. Recompilation is suitable when an assembly is small, or when build time is not an issue. However, for scenarios in which rapid application development is important and small changes are required to be quickly compiled (e.g., for testing purposes), the inability to incrementally generate assemblies results in reduced developer productivity.
It is with respect to these and other considerations that the disclosure made herein is presented.